
<html>
<head><title>Calculator</title></head>
<body>

<h1>Calculator</h1>
(by Masaki Moritani)<br />
Type an expression in the following box (e.g., 10.5+20*3/25).
<p>
<form method="GET">
<input type="text" name="expr"><input type="submit" value="Calculate">
</form>
</p>
<ul>
<li>Only numbers and +,-,* and / operators are allowed in the expression.
<li>The evaluation follows the standard operator precedence.
<li>The calculator does not support parentheses.
<li>The calculator handles invalid input "gracefully". It does not output PHP error messages.
</ul>
Here are some (but not limited to) reasonable test cases:
<ol>
  <li> A basic arithmetic operation:  3+4*5 = 23 </li>
  <li> An expression with floating point or negative sign : -3.2+2*4-1/3 = 4.46666666667, 3+-2.1*2 = -1.2 </li>
  <li> Some typos inside operation (e.g. alphabetic letter): Invalid input expression 2d4+1 </li>
</ol>

<?php

if ($_GET["expr"] != "")
{
  print("<h2>Result</h2>");
  
  $number = '\-?[0-9]+(\.[0-9]*)?';
  $op = '[\+\-\*\/]';
  $pat = '/^[\s]*'.$number.'([\s]*'.$op.'[\s]*'.$number.')*[\s]*$/';
  $divzero = '/[\/][\s]*\-?[0]+(\.[0]*)?([\+\-\*\/]|$|\s)/';
  
  if ( preg_match($pat, $_GET["expr"]) == 1 )
  {
    if ( preg_match($divzero, $_GET["expr"]) > 0 )
    {
      print("{$_GET['expr']} = ");
    }
    else
    {
      eval('$result = ' . $_GET["expr"] . ';');
      print("{$_GET['expr']} = $result");
    }
  }
  else
  {
    print("Invalid expression {$_GET['expr']}");
  }

}

?>

</body>
</html>
